package com.td.filemanager.slice;

import com.td.filemanager.ResourceTable;
import com.td.filemanager.provider.FileItemViewHolder;
import com.td.filemanager.provider.FileListProvider;
import com.td.filemanager.ui.DeviceSelectDialog;
import com.td.filemanager.ui.PopupDialog;
import com.td.filemanager.utils.DistributedFile;
import com.td.filemanager.utils.WidgetHelper;
import ohos.aafwk.ability.AbilitySlice;
import ohos.aafwk.content.Intent;
import ohos.agp.components.*;
import ohos.agp.utils.Color;

import java.util.ArrayList;
import java.util.List;

/**
 * 主页面
 */
public class MainAbilitySlice extends AbilitySlice {
    // 分布式文件类
    private DistributedFile mDistributedFile;

    // 列表容器
    private ListContainer listview;

    // 文件列表提供
    private FileListProvider<FileItemViewHolder> fileProvider;

    // 初始化文件列表
    private final List<FileItemViewHolder> mFileList = new ArrayList<>();

    // 搜索结果文本
    private Text result;

    // 单选按钮容器
    private RadioContainer mRadioContainer;

    // 图片类型单选按钮
    private RadioButton mButtonImage;

    // 音频类型单选按钮
    private RadioButton mButtonAudio;

    // 视频类型单选按钮
    private RadioButton mButtonVideo;

    // 文本类型单选按钮
    private RadioButton mButtonText;

    // 全部类型单选按钮
    private RadioButton mButtonFileAll;

    // 搜索文本框
    private TextField mTextField;

    // 搜索图片按钮
    private Image searchImage;

    // 类型按钮
    private Image mButton;

    // 设备按钮
    private Button mDevice;

    // 类型按钮x,y坐标
    private static final int BUTTON_COORD_X = 350;

    // 类型按钮x,y坐标
    private static final int BUTTON_COORD_Y = 700;

    // 设备按钮x,y坐标
    private static final int DEVICE_COORD_X = 320;

    // 设备按钮x,y坐标
    private static final int DEVICE_COORD_Y = 700;

    // 提示框显示时间, 2秒
    private static final int MSG_SHOW_TIME = 2000;

    // 初始化为图片类型
    private int mFileType = DistributedFile.FILE_TYPE_IMAGE;

    // 初始化查找文本为空
    private String mSearchKey = "";


    @Override
    public void onStart(Intent intent) {
        super.onStart(intent);
        super.setUIContent(ResourceTable.Layout_ability_everything);

        // 初始化分布文件类
        mDistributedFile = new DistributedFile(this);
        // 启动线程 开始初始化分布式文件和获取分布式文件
        mDistributedFile.start();

        // 初始化界面
        initUi();
        // 设置事件监听
        setEventListener();
    }

    /**
     * 初始化界面
     */
    private void initUi() {
        // 获取列表视图
        listview = (ListContainer)this.findComponentById(ResourceTable.Id_listview);
        // 封装文件Provider
        fileProvider = new FileListProvider<>(this, mFileList);
        // 设置列表视图项Provider
        listview.setItemProvider(fileProvider);
        // 初始化隐藏列表视图
        listview.setVisibility(Component.HIDE);
        // 搜索结果文本提示
        result = (Text) findComponentById(ResourceTable.Id_result_info);
        // 初始化显示出来
        result.setVisibility(Component.VISIBLE);
        // 获取单选按钮容器
        mRadioContainer = (RadioContainer)findComponentById(ResourceTable.Id_radio_container);

        // 获取图片类型按钮
        mButtonImage = (RadioButton) this.findComponentById(ResourceTable.Id_sel_image);
        // 获取音频类型按钮
        mButtonAudio = (RadioButton) this.findComponentById(ResourceTable.Id_sel_audio);
        // 获取视频类型按钮
        mButtonVideo = (RadioButton) this.findComponentById(ResourceTable.Id_sel_video);
        // 获取文本类型按钮
        mButtonText = (RadioButton) this.findComponentById(ResourceTable.Id_sel_text);
        // 获取全部类型按钮
        mButtonFileAll = (RadioButton) this.findComponentById(ResourceTable.Id_sel_all);
        // 默认选择第一个
        mRadioContainer.mark(0);
        // 禁用图片按钮单击
        mButtonImage.setClickable(false);

        // 内容输入框
        mTextField = (TextField)this.findComponentById(ResourceTable.Id_textEntry);
        mTextField.setTextColor(Color.BLACK);
        // 搜索按钮
        searchImage = (Image)this.findComponentById(ResourceTable.Id_searchButton);

        // 获取箭头和设备按钮
        mButton = (Image)findComponentById(ResourceTable.Id_AnimaBttn);
        mDevice = (Button)findComponentById(ResourceTable.Id_deviceBttn);
        // 箭头和设备按钮位置
        mButton.setPosition(BUTTON_COORD_X, BUTTON_COORD_Y);
        mDevice.setPosition(DEVICE_COORD_X, DEVICE_COORD_Y);
        // 显示箭头按钮位置
        mButton.setVisibility(Component.VISIBLE);
        // 隐藏设备按钮位置
        mDevice.setVisibility(Component.HIDE);
    }

    /**
     * 设置事件监听
     */
    private void setEventListener() {
        // 设置列表视图事件
        setListViewEvent();
        // 设置单选容器事件
        setRadioContainerEvent();

        // 搜索按钮监听单击事件
        searchImage.setClickedListener(component -> {
            // 获取输入框内容
            mSearchKey = mTextField.getText();
            if (!availableKey(mSearchKey)) {
                WidgetHelper.showTips(this, getString(ResourceTable.String_input_notice_msg), MSG_SHOW_TIME);
                return;
            }

            setListFile();
        });

        mButton.setClickedListener(component -> {
            mButton.setVisibility(Component.HIDE);
            if (mDevice != null) {
                mDevice.setVisibility(Component.VISIBLE);
                mDevice.setFocusable(Component.FOCUS_ENABLE);
            }
        });

        mDevice.setClickedListener(component -> {
            mDevice.setVisibility(Component.HIDE);
            if (mButton != null) {
                mButton.setVisibility(Component.VISIBLE);
                mButton.setFocusable(Component.FOCUS_ENABLE);
            }
            DeviceSelectDialog mDialog = new DeviceSelectDialog(this);
            mDialog.show();
        });
    }

    /**
     * 设置列表视图事件
     */
    private void setListViewEvent() {
        // 列表项单击事件
        listview.setItemClickedListener((container, component, position, id) -> {
            // 获取单击项对象
            FileItemViewHolder item = (FileItemViewHolder) listview.getItemProvider().getItem(position);
            if (item != null && item.getFilepath() != null) {
                // 提示单击的路径
                WidgetHelper.showTips(this,
                        getString(ResourceTable.String_file_path_label) + ": " +
                                item.getFilepath() + "/" + item.getFileName(), MSG_SHOW_TIME);
            }
        });
        // 列表项长按事件
        listview.setItemLongClickedListener((container, component, position, id) -> {
            FileItemViewHolder item = (FileItemViewHolder) listview.getItemProvider().getItem(position);
            if (item != null) {
                PopupDialog mDialog = new PopupDialog(this);
                mDialog.show();
            }
            return true;
        });
    }

    /**
     * 设置单选容器事件
     */
    private void setRadioContainerEvent() {
        // 设置单选按钮修改事件
        mRadioContainer.setMarkChangedListener((radioContainer, idx) -> {
            RadioButton[] mRadioButton = {
                    mButtonImage,
                    mButtonAudio,
                    mButtonVideo,
                    mButtonText,
                    mButtonFileAll
            };

            // 初始化如果是图片类型,跳过
            if (mFileType == idx) {
                return;
            }
            // 如果不是图片类型, 设置为灰色字体, 可以单击
            if (mRadioButton[mFileType] != null) {
                mRadioButton[mFileType].setTextColor(Color.GRAY);
                mRadioButton[mFileType].setClickable(true);
            }
            // 当前类型变成不可以点击
            mFileType = idx;
            mRadioButton[mFileType].setClickable(false);
            // 获取查找文本内容
            mSearchKey = mTextField.getText();
            // 验证文本内容是否为空
            if (availableKey(mSearchKey)) {
                // 设置列表文件
                setListFile();
            }
        });
    }

    /**
     * 验证文本内容是否为空, 并且过滤空格
     * @param key 关键字
     * @return 文本内容是否为空
     */
    private boolean availableKey(String key) {
        if (key == null || key.length() == 0) {
            return false;
        }
        return !key.contains(" ");
    }

    /**
     * 设置列表文件
     */
    private void setListFile() {
        // 判断文件视图是否有文件
        if (getFileViewList()) {
            // 隐藏结果文本提示
            result.setVisibility(Component.HIDE);
            // 显示列表视图
            listview.setVisibility(Component.VISIBLE);
            // 通知数据修改Provider
            fileProvider.notifyDataChanged();
        } else {
            // 显示结果文本提示
            result.setVisibility(Component.VISIBLE);
            // 隐藏列表视图
            listview.setVisibility(Component.HIDE);
        }
    }

    /**
     * 获取文件视图是否有文件
     * @return 文件视图是否有文件
     */
    private boolean getFileViewList() {
        List<String> list;
        if (!mDistributedFile.hasCheckResult()) {
            return false;
        }
        list = mDistributedFile.getFile(mFileType);
        if (list == null || list.size() == 0) {
            return false;
        }

        // 根据查找内容,获取列表信息
        getFileList(list, mSearchKey);

        return mFileList.size() > 0;
    }

    /**
     * 根据查找内容,获取列表信息
     * @param list 列表信息
     * @param key 关键字
     */
    private void getFileList(List<String> list, String key) {
        // 清除之间的记录
        mFileList.clear();
        for (String filename : list) {
            String device;
            String name;
            String path = null;

            int idx = filename.lastIndexOf('/');
            if (idx < 0) {
                name = filename;
            } else {
                name = filename.substring(idx + 1);
                path = filename.substring(0, idx + 1);
            }
            idx = name.indexOf('+');
            if (idx < 0) {
                device = getString(ResourceTable.String_local_device_name);
            } else {
                device = name.substring(0, idx);
                if (DistributedFile.isLocalDevice(this, device, 1)) {
                    device = getString(ResourceTable.String_local_device_name);
                }
                name = name.substring(idx + 1);
            }

            if (filename.contains(key)) {
                int ico = ResourceTable.Media_icon_file;
                int type = mDistributedFile.checkFileType(name);

                if (type == DistributedFile.FILE_TYPE_IMAGE) {
                    ico = ResourceTable.Media_icon_img;
                } else if (type == DistributedFile.FILE_TYPE_AUDIO) {
                    ico = ResourceTable.Media_icon_music;
                } else if (type == DistributedFile.FILE_TYPE_VIDEO) {
                    ico = ResourceTable.Media_icon_video;
                }

                FileItemViewHolder viewHolder = new FileItemViewHolder(name, path, device, ico);
                mFileList.add(viewHolder);
            }
        }
    }

    @Override
    public void onForeground(Intent intent) {
        super.onForeground(intent);
    }

    @Override
    public void onActive() {
        super.onActive();
    }
}
